

#include "qjsonarray.h"
#include "qjsondocument.h"
#include "qjsonobject.h"
#include "ui_mainwindow.h"
#include "mainwindow.h"
#include "qdebug.h"
#include "custominputdialog.h"
#include "utils.h"
#include <QMessageBox>
#include <QTimer>
#include "customcheckbox.h"
#include <QSettings>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow),reconnectTimer(nullptr) // 初始化为空指针
{
    ui->setupUi(this);
    // 初始化设置IP

    ip = loadIPAddress();
    qDebug() << "读取的IP为：" << ip;

    saveIPAddress(ip);
    ui->lineEdit->setText(ip);

    // 绑定事件
    connect(ui->pushButton, &QPushButton::clicked, this, [&]()
            { ui->stackedWidget->setCurrentIndex(0); }); // 页面 1
    connect(ui->pushButton_2, &QPushButton::clicked, this, [&]()
            { ui->stackedWidget->setCurrentIndex(1); }); // 页面 1
    connect(ui->pushButton_3, &QPushButton::clicked, this, [&]()
            { ui->stackedWidget->setCurrentIndex(2); }); // 页面 2
    connect(ui->pushButton_4, &QPushButton::clicked, this, [&]()
            { ui->stackedWidget->setCurrentIndex(3); }); // 页面 3
    connect(ui->pushButton_5, &QPushButton::clicked, this, [&]()
            { ui->stackedWidget->setCurrentIndex(4); }); // 页面 4
    connect(ui->pushButton_6, &QPushButton::clicked, this, [&]()
            { ui->stackedWidget->setCurrentIndex(5); }); // 页面 5
    connect(ui->pushButton_7, &QPushButton::clicked, this, [&]()
            { ui->stackedWidget->setCurrentIndex(6); }); // 页面 6

    // 绑定加载数据
    connect(ui->pushButton_2, &QPushButton::clicked, this, [&]()
            {
                loadColdStorageData("冷藏区", ui->tableWidget); // 刷新数据
            });
    connect(ui->pushButton_3, &QPushButton::clicked, this, [&]()
            {
                loadColdStorageData("回温区", ui->tableWidget_2); // 刷新数据
            });
    connect(ui->pushButton_4, &QPushButton::clicked, this, [&]()
            {
                loadColdStorageData("搅拌区", ui->tableWidget_3); // 刷新数据
            });
    connect(ui->pushButton_5, &QPushButton::clicked, this, [&]()
            {
                load_histroy(ui->tableWidget_4); // 刷新数据
            });
    connect(ui->pushButton_6, &QPushButton::clicked, this, [&]()
            {
                load_users(ui->tableWidget_5); // 刷新数据
            });

    connect(ui->pushButton_7, &QPushButton::clicked, this, [&]()
            {
                load_rule(ui->tableWidget_6); // 刷新数据
            });
    connect(ui->pushButton_7, &QPushButton::clicked, this, [&]()
            {
                load_stir_speed(ui->tableWidget_7); // 刷新数据
            });
    connect(ui->pushButton_7, &QPushButton::clicked, this, [&]()
            {
                get_adjust_time(); // 刷新数据
            });


    // 连接实时的ws
    create_websocket();

    // 双击单元格
//    connect(ui->tableWidget, &QTableWidget::itemDoubleClicked, this, &MainWindow::onItemDoubleClicked);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::load_log(){

    QJsonDocument jsonData; // 填充你的 JSON 数据
    Utils::postDataToApi(ip + "/get_log_data", jsonData, [](const QJsonDocument &responseDoc) {
        // 处理响应
        qDebug() << "响应数据:" << responseDoc;
    });
}

void MainWindow::saveIPAddress(const QString& ipAddress) {
    // 创建 QSettings 对象，指定应用程序和组织名称
    QSettings settings("settings.ini",QSettings::IniFormat);

    // 存储 IP 地址
    settings.setValue("network/ipAddress", ipAddress);

    qDebug() << "IP address saved:" << ipAddress;
}

QString MainWindow::loadIPAddress() {
    // 创建 QSettings 对象，指定应用程序和组织名称
    QSettings settings("settings.ini",QSettings::IniFormat);

    // 读取 IP 地址，如果没有存储过，返回默认值 "127.0.0.1"
    QString ipAddress = settings.value("network/ipAddress", ip).toString();

    qDebug() << "Loaded IP address:" << ipAddress;

    return ipAddress;
}


void MainWindow::onRowCheckBoxClicked(QTableWidget *table, int row, bool checked) {
    if(last_table != table)
        solders.clear();

    if (checked) {
        last_table = table;
        qDebug() << "复选框第" << row << "被点击了";

            // 获取第二列的数据
            QString solder = table->item(row, 2)->text(); // 假设第二列索引为1
        solders.push_back(solder); // 将数据添加到 QVector 中
    } else {
        qDebug() << "复选框第" << row << "被取消选中";

            // 取消选中时移除对应的 solder
            QString solder = table->item(row, 2)->text(); // 获取第二列的数据
        solders.removeAll(solder); // 从 QVector 中移除
    }
    qDebug() << "数据" << solders << "\n";
}



//void MainWindow::onItemDoubleClicked(QTableWidgetItem *item) {
//        QMessageBox::information(this, "选中项", item->text());
//    }

// 加载数据
void MainWindow::refresh_data(){

     loadColdStorageData("冷藏区", ui->tableWidget);
     loadColdStorageData("回温区", ui->tableWidget_2);
     loadColdStorageData("搅拌区", ui->tableWidget_3);
     load_histroy(ui->tableWidget_4); // 加载历史记录
     load_users(ui->tableWidget_5); // 加载人员表
     load_rule(ui->tableWidget_6); // 加载解析规则

     load_stir_speed(ui->tableWidget_7); // 加载搅拌速度
     get_adjust_time(); // 获取库存每日调整时间与无动作后调整时间
}

// 开始入库按钮
void MainWindow::on_pushButton_8_clicked()
{

    QUrl apiUrl("http://" + ip + "/batch_in_stock");
    QJsonDocument jsonData(QJsonDocument::fromJson("{}"));
    Utils::postDataToApi(apiUrl, jsonData, [](const QJsonDocument &responseDoc)
    {
        // 处理响应
        // 获取响应数据
        QJsonObject responseObj = responseDoc.object();
        qDebug() << responseObj;
        int responseData = responseObj["code"].toInt();

        if(responseData != 200)
        {
            QMessageBox::information(nullptr, "提示", responseObj["msg"].toString());
        }else{
            QMessageBox::information(nullptr, "提示", responseObj["msg"].toString());
        }

    });

}

// 库存调整
void MainWindow::on_pushButton_9_clicked()
{
    QUrl apiUrl("http://" + ip + "/stock_adjust");

    qDebug() << "请求地址：" << ip + "/stock_adjust";

    QJsonDocument jsonData(QJsonDocument::fromJson("{}"));
    Utils::post_display(apiUrl, jsonData);


}

void MainWindow::loadColdStorageData(QString location_name, QTableWidget *widget)
{
    QUrl apiUrl("http://" + ip + "/get_location_data");

    // 构建要发送的 JSON 数据
    QJsonObject jsonObj;
    jsonObj["location"] = location_name;
    jsonObj["limit"] = 100;
    QJsonDocument jsonData(jsonObj);
//    Utils::fetchDataAndLoadTable(this,apiUrl, jsonData, widget);
    MainWindow::fetchDataAndLoadTable(apiUrl, jsonData, widget);

}

void MainWindow::load_histroy(QTableWidget *widget)
{
    QUrl apiUrl("http://" + ip + "/get_move_history_data");
    QJsonObject jsonObj;
    jsonObj["limit"] = 100; // 例如，传递 limit 参数
    QJsonDocument jsonData(jsonObj);
    Utils::fetchDataAndLoadTable(apiUrl, jsonData, widget);
}

void MainWindow::load_users(QTableWidget *widget)
{
    QUrl apiUrl("http://" + ip + "/get_user_data");
    QJsonObject jsonObj;
    jsonObj["limit"] = 100; // 例如，传递 limit 参数
    QJsonDocument jsonData(jsonObj);
    Utils::fetchDataAndLoadTable(apiUrl, jsonData, widget);
}

// 出库
void MainWindow::on_pushButton_10_clicked()
{
//    if (!Utils::hasSelectedRows(ui->tableWidget))
//    {
//        // 弹出错误消息框
//        QMessageBox::warning(this, "错误", "请选择要出库的数据。");
//        return;
//    }

//    QVector<QString> result; // 传参示例里面的solders
//    QVector<QVector<QString>> nums = Utils::getSelectedRowsData(ui->tableWidget);
//    for (const QVector<QString> &row : nums)
//    {
//        if (!row.isEmpty())
//        {
//            result.push_back(row[1]);
//        }

//    }

    // 构建 JSON 数据
    QJsonObject jsonObj;

    jsonObj["solders"] = QJsonArray::fromStringList(QList<QString>::fromVector(solders));

    QJsonDocument jsonData(jsonObj);
    QUrl apiUrl("http://" + ip + "/out_stock");

    // 发送请求
    Utils::post_display(apiUrl, jsonData);

    loadColdStorageData("冷藏区", ui->tableWidget);
}

// 出库搅拌
void MainWindow::on_pushButton_11_clicked()
{
//    if (!Utils::hasSelectedRows(ui->tableWidget_2))
//    {
//        // 弹出错误消息框
//        QMessageBox::warning(this, "错误", "请选择要出库的数据。");
//        return;
//    }

//    QVector<QString> result; // 传参示例里面的solders
//    QVector<QVector<QString>> nums = Utils::getSelectedRowsData(ui->tableWidget_2);
//    for (const QVector<QString> &row : nums)
//    {
//        if (!row.isEmpty())
//        {
//            result.push_back(row[1]);
//        }
//    }

    // 构建 JSON 数据
    QJsonObject jsonObj;
    jsonObj["solders"] = QJsonArray::fromStringList(QList<QString>::fromVector(solders));
    qDebug() << "出库搅拌" << solders;

    QJsonDocument jsonData(jsonObj);
    QUrl apiUrl("http://" + ip + "/picking_stir");

    // 发送请求
    Utils::post_display(apiUrl, jsonData);

    loadColdStorageData("回温区", ui->tableWidget_2);
}

// 回温
void MainWindow::on_pushButton_12_clicked()
{
//    if (!Utils::hasSelectedRows(ui->tableWidget))
//    {
//        // 弹出错误消息框
//        QMessageBox::warning(this, "错误", "请选择要出库的数据。");
//        return;
//    }

//    QVector<QString> result; // 传参示例里面的solders
//    QVector<QVector<QString>> nums = Utils::getSelectedRowsData(ui->tableWidget);
//    for (const QVector<QString> &row : nums)
//    {
//        if (!row.isEmpty())
//        {
//            result.push_back(row[1]);
//        }

//    }



    // 构建 JSON 数据
    QJsonObject jsonObj;
    jsonObj["solders"] = QJsonArray::fromStringList(QList<QString>::fromVector(solders));

    QJsonDocument jsonData(jsonObj);

    QUrl apiUrl("http://" + ip + "/stock_thawing");

    // 发送请求
    Utils::post_display(apiUrl, jsonData);
    qDebug() << jsonData << "测试";

    loadColdStorageData("回温区", ui->tableWidget_2);
}

// 回冷藏
void MainWindow::on_pushButton_15_clicked()
{
    QUrl apiUrl("http://" + ip + "/rb_in_stock");

//    QVector<QString> result; // 传参示例里面的solders
//    QVector<QVector<QString>> nums = Utils::getSelectedRowsData(ui->tableWidget);
//    for (const QVector<QString> &row : nums)
//    {
//        if (!row.isEmpty())
//        {
//            result.push_back(row[1]);
//            qDebug() << row.last();
//        }
//    }

    // 构建 JSON 数据
    QJsonObject jsonObj;
    jsonObj["solders"] = QJsonArray::fromStringList(QList<QString>::fromVector(solders));
    QJsonDocument jsonData(jsonObj);
    Utils::post_display(apiUrl, jsonData);

    loadColdStorageData("回温区", ui->tableWidget_2);
}

// 加载解析规则表格
void MainWindow::load_rule(QTableWidget *widget)
{
    QUrl apiUrl("http://" + ip + "/get_analysis_data");
    qDebug() << QString("请求数据:%1").arg(ip);
    QJsonDocument jsonData(QJsonDocument::fromJson("{}"));
    Utils::fetchDataAndLoadTable(apiUrl, jsonData, widget);
}

// 搅拌转速设置
void MainWindow::on_pushButton_13_clicked()
{
    QUrl apiUrl("http://" + ip + "/set_solder_speed");

    // 获取整个表格数据并构建 JSON 参数
    QJsonDocument jsonData = Utils::getTableDataAsJson(ui->tableWidget_7);
    qDebug() << "set_solder_speed传参：" << jsonData;
    Utils::post_display(apiUrl, jsonData);


}

// 加载搅拌转速表格
void MainWindow::load_stir_speed(QTableWidget *widget)
{
    QUrl apiUrl("http://" + ip + "/get_solder_speed");
    QJsonDocument jsonData(QJsonDocument::fromJson("{}"));
    Utils::fetchDataAndLoadTable(apiUrl, jsonData, widget);

}

// 加载搅拌转速表格(同步)
void MainWindow::on_pushButton_16_clicked()
{
    QUrl apiUrl("http://" + ip + "/get_solder_speed");
    QJsonDocument jsonData(QJsonDocument::fromJson("{}"));
    Utils::fetchDataAndLoadTable(apiUrl, jsonData, ui->tableWidget_7);

}

// 获取库存每日调整时间与无动作后调整时间
void MainWindow::get_adjust_time()
{
    QUrl apiUrl("http://" + ip + "/get_stock_adjust");
    QJsonDocument jsonData(QJsonDocument::fromJson("{}"));
    Utils::postDataToApi(apiUrl, jsonData, [](const QJsonDocument &responseDoc)
                         {

    // 解析 JSON 数据
    if (responseDoc.isObject()) {
        QJsonObject jsonObj = responseDoc.object();
        QJsonObject dataObj = jsonObj["data"].toObject();
        QString every_day = dataObj["every_day"].toString();
        QString no_action = dataObj["no_action"].toString();
        qDebug() << "every_day: " << every_day;
        qDebug() << "no_action: " << no_action;
        
    } });
}



// 连接websocket
void MainWindow::create_websocket()
{
    if (m_webSocket.isValid())
    {
        // 先主动关闭
        m_webSocket.disconnect();
        m_webSocket.close();
    }


    // 连接websocket信号
    connect(&m_webSocket, &QWebSocket::connected, this, &MainWindow::onWebSocketConnected);
    connect(&m_webSocket, static_cast<void(QWebSocket::*)(QAbstractSocket::SocketError)>(&QWebSocket::error), this, &MainWindow::onWebSocketError);
    connect(&m_webSocket, &QWebSocket::textMessageReceived, this, &MainWindow::onWebSocketTextMessageReceived);

    // 连接到房间
    QString ws_ip = QString("ws://%1/read_temperature").arg(ip);
    m_webSocket.open(QUrl(ws_ip));
}


// 连接WebSocket槽函数
void MainWindow::onWebSocketConnected()
{
	qDebug() << "WebSocket was connected";
}

// 处理错误WebSocket槽函数
void MainWindow::onWebSocketError(QAbstractSocket::SocketError error)
{
    // 如果定时器已经存在并且是活动状态，停止它
    if (reconnectTimer && reconnectTimer->isActive()) {
        reconnectTimer->stop();
    } else if (!reconnectTimer) {
        // 如果定时器尚未创建，则创建一个新的
        reconnectTimer = new QTimer(this);
        connect(reconnectTimer, &QTimer::timeout, this, &MainWindow::create_websocket);
    }

    // 设置定时器为单次触发并启动
    reconnectTimer->setSingleShot(true);
    reconnectTimer->start(10000); // 10秒后触发
}



// 接收实时消息
void MainWindow::onWebSocketTextMessageReceived(const QString& message)
{
    QJsonObject jsonObject = Utils::parseJsonFromString(message);

    if (jsonObject.isEmpty()) return;
    if(!jsonObject["temperature"].isNull()){
        ui->label->setText("冷藏区温度：" + jsonObject["temperature"].toString());
    }
    
    
}


// 解析数据，加载表格（带复选框）
void MainWindow::fetchDataAndLoadTable(const QUrl &apiUrl, const QJsonDocument &jsonData, QTableWidget *table) {
    Utils::postDataToApi(apiUrl, jsonData, [table, this](const QJsonDocument &responseDoc) {
        // 清空表格
        table->clear();
        table->setRowCount(0); // 重置行数
        table->setColumnCount(0); // 重置列数
        table->setSortingEnabled(true); // 启用排序
        // 设置表格内容自适应宽度
        table->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);

        // 处理响应
        if (responseDoc.isObject()) {
            QJsonObject jsonObject = responseDoc.object();

            // 开始解析表头数据，设置表头
            if (jsonObject["code"].toInt() == 200) {
                // 获取 "data" 对象
                QJsonObject dataObj = jsonObject["data"].toObject();

                // 解析 "keys" 数组，作为表头
                QJsonArray keysArray = dataObj["keys"].toArray();
                table->setColumnCount(keysArray.size() + 1); // 设置列数，加一列用于复选框
                QStringList headers;
                headers << "选择"; // 添加复选框列的表头
                for (const QJsonValue &key : keysArray) {
                    QJsonObject keyObj = key.toObject();
                    QString keyValue = keyObj[keyObj.keys().first()].toString(); // 获取值，作为表头
                    headers << keyValue;
                }
                table->setHorizontalHeaderLabels(headers); // 设置表头

                // 解析 "values" 数组并添加到表格中
                QJsonArray valuesArray = dataObj["values"].toArray();

                // 禁用表格更新
                table->setUpdatesEnabled(false);

                // 遍历数据并添加行
                for (const QJsonValue &value : valuesArray) {
                    QJsonObject obj = value.toObject();
                    int row = table->rowCount();
                    table->insertRow(row); // 插入新行

                    // 创建复选框并设置
                    CustomCheckBox *checkBox = new CustomCheckBox();
                    checkBox->setChecked(false);
                    table->setCellWidget(row, 0, checkBox); // 将复选框放到表格中

                    // 连接复选框点击信号到接收者的槽函数
                    QObject::connect(checkBox, &CustomCheckBox::clicked, [this, table, row](bool checked) {
                        onRowCheckBoxClicked(table, row, checked); // 调用 MainWindow 中的槽函数
                    });

                    // 遍历 keys 并获取对应的值
                    for (int col = 0; col < keysArray.size(); ++col) {
                        QJsonObject keyObj = keysArray[col].toObject();
                        QString keyName = keyObj.keys().first(); // 获取键名
                        CustomTableWidgetItem *item;

                        // 获取对应的值并设置到表格中
                        if (obj.contains(keyName)) {
                            if (obj[keyName].isDouble()) {
                                item = new CustomTableWidgetItem(QString::number(obj[keyName].toDouble()));
                            } else if (obj[keyName].isString()) {
                                item = new CustomTableWidgetItem(obj[keyName].toString());
                            } else {
                                item = new CustomTableWidgetItem(""); // 如果为空或不匹配，设置为空字符串
                            }
                        } else {
                            item = new CustomTableWidgetItem(""); // 如果没有匹配的字段，设置为空字符串
                        }

                        // 设置内容居中显示
                        item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                        table->setItem(row, col + 1, item); // 设置内容到对应列，注意偏移
                    }
                }

                // 恢复表格更新
                table->setUpdatesEnabled(true);
            } else {
                qDebug() << "请求失败，错误码：" << jsonObject["code"].toInt();
            }
        } else {
            qDebug() << "响应不是对象类型";
        }

        // 设置表格大小并显示
        table->resize(400, 300);
        table->show();
    });
}


// 设置IP
void MainWindow::on_pushButton_18_clicked()
{
  // 获取IP地址
  ip = ui->lineEdit->text();
    saveIPAddress(ip);
  // 弹出对话框
  QMessageBox::information(this, "提示", "IP地址设置成功！");
}

